#include "Escuela.h"


///////////////////////////// Constructor y Desctructor ////////////////////////
Escuela::Escuela(string nom = 0)
{
	nombre = nom;
	cursos = new Lista<Curso>();
	profesores = new Lista<Profesor>();
	director=NULL;
	estudiantes = new Lista<Estudiante>();

}

Escuela::~Escuela()
{
	delete cursos;
	delete profesores;
	delete director;
	delete estudiantes;
}

///////////////////////////////////////////////////////////////////////////////////

string Escuela::toString()
{
	stringstream s;
	s<<"Escuela: "<<nombre<<endl;
	if(director!=NULL)
     s<<"Director: "<<director->toString();

	return s.str();
}

string Escuela::getNombre()
{
    return nombre;
}

Lista<Curso>* Escuela::getLista()
{
	return cursos;
}


Lista<Profesor> * Escuela::getProfesores()
{
    return profesores;
}

void Escuela::setDirector(Profesor *p)
{
    director=p;
}

Profesor * Escuela::getDirector()
{
    return director;
}

Lista<Estudiante> *Escuela::getEstudiantes()
{
    return estudiantes;
}


bool Escuela::asignarProfeDirector(string cedula1)
{
    Profesor *aux;
    aux=profesores->buscar(cedula1);
    if(aux !=NULL)
    {
        director=aux;
        return true;
    }
    return false;

}

// inserta el codigo de un curso y retorna una lista con los profesores que imparten dicho curso

Lista<Profesor> * Escuela::listaProfesDeUnCurso(string codigo1){

  if(profesores->getPrimero()==NULL)
    {
        return NULL;
    }
    else
    {


        Lista<Profesor> *list;
        list=new Lista<Profesor>();
        profesores->setActual(profesores->getPrimero());
        while(profesores->getActual() !=NULL)
         {



           if(profesores->getActual()->getInfo()->getCursos()->buscar(codigo1) !=NULL)
           list->insertarPrimero(profesores->getActual()->getInfo());

          profesores->setActual(profesores->getActual()->getSigNodo());


         }
         if(list->getPrimero()==NULL)
         return NULL;

         else
         return list;


}
}

//void Escuela::mostrarCursosConProfes()
string Escuela::toStringCursosConProfes()
{
	stringstream s;
    if(cursos->getPrimero()!=NULL)
    {
      cursos->setActual(cursos->getPrimero());
      Curso *aux;
      while(cursos->getActual()!=NULL)
      {
        aux=cursos->getActual()->getInfo();
        s<<aux->toString()<<endl;
        Lista<Profesor> *l1;
        l1=listaProfesDeUnCurso(aux->getSigla());
        if(l1!=NULL)
        	//l1->mostrarLista();
        	s<<l1->toString();
        cursos->setActual(cursos->getActual()->getSigNodo());

      }
    }
    return s.str();
}

Lista<Estudiante> * Escuela::listaEstudiantesDeUnCurso(string codigo1){

  if(estudiantes->getPrimero()==NULL)
    {
        return NULL;
    }
    else
    {


        Lista<Estudiante> *list;
        list=new Lista<Estudiante>();
        estudiantes->setActual(estudiantes->getPrimero());
        while(estudiantes->getActual() !=NULL)
         {



           if(estudiantes->getActual()->getInfo()->getCursos()->buscar(codigo1) !=NULL)
           list->insertarPrimero(estudiantes->getActual()->getInfo());

          estudiantes->setActual(estudiantes->getActual()->getSigNodo());


         }
         if(list->getPrimero()==NULL)
         return NULL;

         else
         return list;


}
}


bool Escuela::operator ==(string nom){
   if(nombre==nom)
      return true;
   else
      return false;

}



	//-------------------------------------------------------------------
	//-----------------metodos especiales de listacurso----------------

int Escuela::modificarCurso(string codigo,string nom){

    
	int ret=0;
	cursos->setActual(cursos->getPrimero());
	Curso* aux = cursos->buscar(codigo);
	if(aux!=NULL)
	{
		aux->setNombre(nom);
		ret=1;
	}
	return ret;



}
	
	//-------------------------------------------------------------------

//-----------------------metodos de listaprofesor------------------------


int Escuela::modificarProfesor(string cedula1,string nom, string ap1, string ap2)
{
	int ret=0;
	profesores->setActual(profesores->getPrimero());
	Profesor* aux = profesores->buscar(cedula1);
	if(aux!=NULL)
	{
		aux->setNombre(nom);
		aux->setApellido1(ap1);
		aux->setApellido2(ap2);
		ret=1;
	}
	return ret;
}


void Escuela::eliminaCursosDeProfes(string codigo1)
{
	if(profesores->getPrimero()!=NULL)
	{
	   profesores->setActual(profesores->getPrimero());
	   Lista<Curso> *c;
	   while(profesores->getActual()!=NULL)
	   {
		   c=profesores->getActual()->getInfo()->getCursos();
		   if(c!=NULL)
		   {
			   if(c->buscar(codigo1)!=NULL)
				   c->eliminar(codigo1);
		   }
		   profesores->setActual(profesores->getActual()->getSigNodo());

	   }
	}

}


//-----------------------------------------------------------------------
//----------------------metodos listaEstudiante--------------------------




void Escuela::eliminaCursosDeEstudiantes(string codigo1)
{
	if(estudiantes->getPrimero()!=NULL)
	{
	   estudiantes->setActual(estudiantes->getPrimero());
	   Lista<Curso> *c;
	   while(estudiantes->getActual()!=NULL)
	   {
		   c=estudiantes->getActual()->getInfo()->getCursos();
		   if(c!=NULL)
		   {
			   if(c->buscar(codigo1)!=NULL)
				   c->eliminar(codigo1);
		   }
		   estudiantes->setActual(estudiantes->getActual()->getSigNodo());

	   }
	}

}



int Escuela::modificarEstudiante(string ced,string nom, string ap1, string ap2,string nacio, bool b, float cant)//codigo para buscar el curso y nombre para cambiarlo
{
	Nodo<Estudiante>* nodo;
	Nodo<Estudiante>* anterior = NULL;
	Estudiante *est;
	estudiantes->setActual(estudiantes->getPrimero());
	while(estudiantes->getActual() != NULL)
	{
		if(estudiantes->getActual()->getInfo()->getCedula() == ced || estudiantes->getActual()->getInfo()->getCarne() == ced)
		{
			nodo = estudiantes->getActual();
			break;
		}

		anterior = estudiantes->getActual();
		estudiantes->setActual(estudiantes->getActual()->getSigNodo());
	}
	if(nodo == NULL)
	{
		return 0;
	}
		if(nodo->getInfo()->getNacionalidad()  != nacio && (nacio == "Costarricense" || nacio == "costarricense"))
		{
			string carne, cedu;
			string bec;
			//bool b = false;
			//int cant =0;
			carne = nodo->getInfo()->getCarne();
			cedu = nodo->getInfo()->getCedula();
			/*cout<<"Es el estudiante becado? (si/otra cosa para no): ";
			cin>>bec;
			if(bec == "si")
			{
				b = true;
				cout<<"Defina el porcentaje de la beca: ";
				cin>>cant;
			}*/
			//est = new Nacional(nom, ap1, ap2, cedu, nacio, carne, b, cant);
			est = new Nacional(nom, ap1, ap2, cedu, nacio, carne, b, cant);
			est->setCursos( new Lista<Curso>(nodo->getInfo()->getCursos()));
			delete nodo->getInfo();
			nodo->setInfo(est);

			return 1;
		}
		else if(nodo->getInfo()->getNacionalidad()  != nacio && (nodo->getInfo()->getNacionalidad() == "Costarricense" || nodo->getInfo()->getNacionalidad() == "costarricense"))
		{
			string carne, cedu;
			carne = nodo->getInfo()->getCarne();
			cedu = nodo->getInfo()->getCedula();
			est = new Extranjero(nom, ap1, ap2, cedu, nacio, carne);
			est->setCursos( new Lista<Curso>(nodo->getInfo()->getCursos()));
			delete nodo->getInfo();
			nodo->setInfo(est);
			return 1;
		}
		else
		{
			nodo->getInfo()->setNombre(nom);
			nodo->getInfo()->setApellido1(ap1);
			nodo->getInfo()->setApellido2(ap2);
			nodo->getInfo()->setNacionalidad(nacio);
			return 1;
		}
		return 0;
}






string  Escuela::toStringArancel(string var)
{
	stringstream s;
	Estudiante* obj = estudiantes->buscar(var);
	s<<obj->toString()<<endl;
	s<<"------------------------------------------\n";
	obj->getCursos()->setActual(obj->getCursos()->getPrimero());
	s<<"\t Nombre del curso \t\t Codigo \t\t Creditos \t\t Valor por Credito\n";
	while(obj->getCursos()->getActual() != NULL)
	{
		s<<"\t"<<obj->getCursos()->getActual()->getInfo()->getNombre()<<"\t\t\t"
				<<obj->getCursos()->getActual()->getInfo()->getSigla()<<"\t\t\t"
				<<obj->getCursos()->getActual()->getInfo()->getCreditos()<<"\t\t\t"
				<<obj->getCursos()->getActual()->getInfo()->getCreditos() * obj->getCursos()->getActual()->getInfo()->getValorCredito()
				<<endl;
		obj->getCursos()->setActual(obj->getCursos()->getActual()->getSigNodo());
	}
	s<<"-----------------------------------------\n";
	s<<"Creditos totales: "<<obj->creditosTotales()<<endl;
	s<<"Gastos en Matricula: "<<obj->gastosMatricula()<<endl;
	s<<"Total: "<<obj->arancel()<<endl;
	return s.str();
}







